package util;

import DAO.MyDrawPane;
import DAO.NodeList;
import DAO.TreeNode;

/**
 * 提供树操作工具，如添加根节点、添加子节点
 */
public class TreeUtil {

    private static int id = 1;  // 节点的初始id

    // 创建中心节点
    public static void createRoot() {
        TreeNode root = new TreeNode(0,"中心主题");
        root.setNid(id++); // 赋值完节点的号码后进行++以实现节点号码的递增
        MyDrawPane.g.getChildren().add(root); // 把节点添加到绘图区
        MyDrawPane.g.applyCss();
        MyDrawPane.g.layout();
        NodeList.list.add(root); // 将node添加到list中方便管理
        root.setX(MyDrawPane.drawPane.getWidth()/2-root.getWidth()/2);  // 将跟节点放置在绘图区中间
        root.setY(MyDrawPane.drawPane.getHeight()/2-root.getHeight()/2);
    }

    // 添加节点
    public static void addNode(TreeNode p) {
        TreeNode node = new TreeNode(p.getNid(),"分支主题");
        node.setNid(id++);
        NodeList.list.add(node);    // 将node添加到list中方便管理
        p.getNodeChildren().add(node);  // 在父节点下添加子节点
        MyDrawPane.g.getChildren().add(node);  // 把节点添加到绘图区
        MyDrawPane.g.applyCss();
        MyDrawPane.g.layout();

        /* for (Node node1 : MyDrawPane.g.getChildren()){  // 用于查看面板中含有哪些组件
               System.out.println(node1);
         } */

        if(p.getPos()==1) {      // 若该节点为右节点，则x坐标向右变大
            node.setX(p.getX() + p.getWidth() + 50);
            node.setY(p.getY());  //TODO Y坐标还没设置
        }else{         // 反之node应为子节点，x坐标应向左变小
            node.setX(p.getX() - node.getWidth() - 50);
        }
    }

    // 删除节点
    public static void deleteNode(TreeNode node){
        //TODO 未完成
        //删除node父亲孩子list中的的结点
        TreeNode p = NodeList.getParent(node);   // 取出该节点的父节点
        for(int i = 0;i < p.getNodeChildren().size();i++) {   // 将其移出list
            if(node.getNid() == p.getNodeChildren().get(i).getNid()) {
                p.getNodeChildren().remove(i);
                break;
            }
        }
        deleteChildren(node);

        NodeLocatorUtil.locateX(NodeList.getRoot());
        NodeLocatorUtil.locateY(NodeList.getRoot());
    }

    // 递归删除node下的全部节点
    private static void deleteChildren(TreeNode node){
        for(int i = 0;i < NodeList.list.size();i++) {
            if(NodeList.list.get(i).getNid() == node.getNid()) {
                NodeList.list.remove(i);
            }
        }
        //删除list中node所有的子结点
        if(!node.getNodeChildren().isEmpty()) {
            for(int i = 0;i < node.getNodeChildren().size(); i++) {
                deleteChildren(node.getNodeChildren().get(i));
            }
        }
    }

}


